<?php defined('BASEPATH') OR exit('No direct script access allowed');


//前台控制器基类
class Web_Controller extends CI_Controller {

	public function __construct()
	{
		parent::__construct();

		//加载前后台公共辅助函数库，URL函数库
		$this->load->helper(array('common_functions_helper', 'url')); 

		$this->load->library('session'); //加载session





	}

}



//后台控制器基类
class Admin_Controller extends CI_Controller {

	//后台用户对象
	public $admin = null;

	//当前用户角色权限数组
	public $admin_permissions_arr;

	//是否为ajax操作, 如果是ajax，未登录用户或无权限时显示特定的ajax信息
	public $is_ajax = false;

	//后台管理目录名称
	public $admin_dir_name;

	//不需要验证操作权限的文件数组(非登录权限)
	public $no_method_auth_file_arr = array('index.html', 'index.php', 'home.php', 'passport.php');


	public function __construct()
	{
		parent::__construct();

		//加载前后台公共辅助函数库，后台辅助函数库，URL函数库
		$this->load->helper(array('common_functions_helper', 'admin_functions_helper', 'url')); 

		$this->load->library('session'); //加载session

		$current_uri = $this->uri->segment_array();
		$this->admin_dir_name = $current_uri[1]; //后台管理目录名称

		//验证后台用户及操作授权
		$admin_id = $this->session->admin_id;

		if($admin_id)
		{
			//根据用户id获取合法用户
			$this->load->model('admin/admin_model', 'admin_verify');

			$current_admin = $this->admin_verify->get_admin_by_id($admin_id);

			if(empty($current_admin))
			{
				$this->admin_verify_failed(); //用户验证失败处理
			}
			else
			{
				$this->admin = $current_admin; //管理员对象赋值

				$this->admin_permissions_arr = unserialize($this->admin->permissions); //当前用户权限数组
				if(!$this->admin_permissions_arr)
				{
					$this->admin_permissions_arr = array(); //unserialize函数返回flase时, 赋值这空数组, 防止程序运行错误
				}

				$this->admin_method_auth(); //当前method的操作授权
			}
		}
		else
		{
			$this->admin_verify_failed(); //用户验证失败处理
		}		
	}


    /**
     * 用户验证失败处理函数
     */
	public function admin_verify_failed()
	{
		//判断是否为ajax操作, 注意: URI中包含 ajax_ 时, 判断为ajax操作
		$current_uri = $this->uri->uri_string();
		if(stripos($current_uri, 'ajax_'))
		{
			$this->is_ajax = true;
		}

		//是ajax操作是返回ajax数据, 不是ajax时跳转到登录页面
		if($this->is_ajax)
		{
			$this->load->model('bases/ajax');
			
			$this->ajax->warnings = '未登录或登录过期，请重新登录！';
			$this->ajax->status_code = Ajax::STATUS_CODE_FAILED;

			$this->ajax->render();
		}
		else
		{
			echo '<script type="text/javascript">document.location="/' . $this->admin_dir_name . '/passport";</script>';
			exit();
		}
	}


    /**
     * 加载后台管理页面
     * param string $admin_tpl: 后台模板文件名(相对于views/admin/目录)
     * param array $data:  模板数据
     * param boolean $return:  是否返回而非echo
     */
	public function display($admin_tpl = 'index.html', $data = array(), $return = FALSE)
	{

		$this->load->view("admin/$admin_tpl", $data, $return);
		
	}


    /**
     * 输出成功信息
     * param string $info: 成功信息
     * param boolean $tabid: 是否刷新tab, 多个tabid用逗号隔开
     * param boolean $close_me:  是否关闭当前tab 或 dialog
     */
    protected function success($info = '', $tabid = '', $close_me = true)
    {
		if(!$info) $info = '操作成功！';

		if($close_me){
			$close_me = true;
		}else{
			$close_me = false;
		}

		$result = array('statusCode' => 200, 'message' => $info, 'closeCurrent' => $close_me, 'tabid' => $tabid);

		die(json_encode($result));
    }


    /**
     * 输出错误信息
     * param string $error: 错误信息
     * param boolean $close_me:  是否关闭当前tab 或 dialog
     */
    protected function error($error = '', $close_me = false)
    {
		if(!$error) $error = '操作失败，请重试！';

		if($close_me){
			$close_me = true;
		}else{
			$close_me = false;
		}

		$result = array('statusCode' => 300, 'message' => $error, 'closeCurrent' => $close_me);

		die(json_encode($result));
    }


	/*
	* 后台管理控制器中的action(method)权限验证, 即管理员具体操作的权限验证
	*
	* @return null
	*/
	private function admin_method_auth()
	{
		$current_controller = strtolower($this->router->class) . '.php'; //当前控制器名
		$current_method = strtolower($this->router->method); //当前控制器正要运行的method

		//超级管理员 或 不需要验证操作权限的文件 或 以“_”或“ajax_”开头的方法名不验证操作权限
		if($this->admin->id == 1 OR $this->admin->role_id == 1 OR in_array($current_controller, $this->no_method_auth_file_arr) OR preg_match('/^(_|ajax_)+\w/msi', $current_method))
		{
			return true;
		}

		$role_permissions = $this->admin_permissions_arr; //当前用户权限数组

		//验证操作权限及输出错误
		if(!array_key_exists($current_controller, $role_permissions) OR !in_array($current_method, $role_permissions[$current_controller]))
		{
			$this->error('操作未授权!');
		}
	}


	/*
	* 验证当前用户是否显示包含某文件的链接
	*
	* param string $filename: 文件名
	*
	* @return boolean true | false
	*/
	public function link_auth($filename)
	{
		if(empty($filename)) return false;

		if(strcasecmp(substr($filename, -4), '.php') !== 0)
		{
			$filename .= '.php';
		}

		//超级管理员 或 不需要验证操作权限的文件
		if($this->admin->id == 1 OR $this->admin->role_id == 1 OR array_key_exists($filename, $this->admin_permissions_arr) OR in_array($filename, $this->no_method_auth_file_arr) )
		{
			return true;
		}

		return false;
	}

}

